package Controller;

import java.util.ArrayList;
import java.util.List;

import Beans.MesaBean;
import DAO.HibernateMesaDAO;
import DAO.HibernateSectorDAO;
import DTO.MesaDTO;
import DTO.SalonDTO;
import Model.Mesa;
import Model.Reserva;
import Model.Sector;

public class AdministradorMesa {
	private static AdministradorMesa instancia;
	private AdministradorMesa(){
		
	}
	public static AdministradorMesa getInstancia(){
		if(instancia==null)
			instancia=new AdministradorMesa();
		return instancia;
	}
	public List<MesaBean> fromModelTOBean(List<Mesa> mesas) {
		List<MesaBean> mesasBean=new ArrayList<MesaBean>();
		for (Mesa mesa : mesas) {
			MesaBean mesaBean=fromModelTOBean(mesa);
			mesasBean.add(mesaBean);
		}
		return mesasBean;
	}
	public MesaBean fromModelTOBean(Mesa mesa) {
		MesaBean mesaBean=null;
		if(mesa!=null){
		mesaBean=new MesaBean();
		mesaBean.setIdMesa(mesa.getId());
		mesaBean.setCapacidad(mesa.getCapacidad());
		mesaBean.setCapacidadMaxima(mesa.getCapacidadMaxima());
		mesaBean.setEstado(mesa.getEstado());
		mesaBean.setNumero(mesa.getNumero());
		}
		return mesaBean;
	}
	public List<Mesa> fromDTOTOModel(List<MesaDTO> mesasDTO) {
		List<Mesa> mesas=new ArrayList<Mesa>();
		for (MesaDTO mesaDTO : mesasDTO) {
			Mesa mesa=fromDTOTOModel(mesaDTO);
			mesas.add(mesa);
		}
		return mesas;
	}
	
	public Mesa fromDTOTOModel(MesaDTO mesaDTO) {
		Mesa mesa=null;
		if(mesaDTO!=null){
		mesa=new Mesa();
		mesa.setId(mesaDTO.getId());
		mesa.setCapacidad(mesaDTO.getCapacidad());
		mesa.setCapacidadMaxima(mesaDTO.getCapacidadMaxima());
		mesa.setEstado(mesaDTO.getEstado());
		mesa.setNumero(mesaDTO.getNumero());
		}
		return mesa;
		}
	
	public List<MesaDTO> fromModelTODTO(List<Mesa> mesas) {
		List<MesaDTO> mesasDTO=new ArrayList<MesaDTO>();
		for (Mesa mesa : mesas) {
			MesaDTO mesaDTO=fromModelTODTO(mesa);
			mesasDTO.add(mesaDTO);
		}
		return mesasDTO;
	}
	
	public MesaDTO fromModelTODTO(Mesa mesa) {
		MesaDTO mesaDTO=null;
		if(mesa!=null){
			mesaDTO=new MesaDTO();
			mesaDTO.setId(mesa.getId());
			mesaDTO.setCapacidad(mesa.getCapacidad());
			mesaDTO.setCapacidadMaxima(mesa.getCapacidadMaxima());
			mesaDTO.setEstado(mesa.getEstado());
			mesaDTO.setNumero(mesa.getNumero());
		}
		return mesaDTO;
		}
	
	public List<Mesa> fromBeanTOModel(List<MesaBean> mesasBean) {
		List<Mesa> mesas=new ArrayList<Mesa>();
		for (MesaBean mesaBean : mesasBean) {
			Mesa mesa=fromBeanTOModel(mesaBean);
			mesas.add(mesa);
		}
		return mesas;
	}
	public Mesa fromBeanTOModel(MesaBean mesaBean) {
		Mesa mesa=null;
		if(mesaBean!=null){
		mesa=new Mesa();
		mesa.setId(mesaBean.getIdMesa());
		mesa.setCapacidad(mesaBean.getCapacidad());
		mesa.setCapacidadMaxima(mesa.getCapacidadMaxima());
		mesa.setEstado(mesaBean.getEstado());
		mesa.setNumero(mesaBean.getNumero());
		}
		return mesa;
	}
public List<Mesa> getMesasParaAbrir(int cantComenzales, List<Mesa> mesasDisponibles,List<Reserva> reservasDeAhora, SalonDTO s) {
		
		List<Mesa>mesas=getMesasParaLasReservasDeAhora(reservasDeAhora, s);
		try {
			mesas=getMesas(mesas, cantComenzales, s);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return mesas;
	}
	
	
	
	private List<Mesa> getMesasParaLasReservasDeAhora(List<Reserva>reservasDeAhora,SalonDTO salon) {
		List<Mesa>mesas=new ArrayList<Mesa>();
		List<Mesa>aux=new ArrayList<Mesa>();
		List<Sector>sectores=HibernateSectorDAO.getInstancia().getSectores(salon.getId());
			
			
		for(Reserva r:reservasDeAhora){
			int cantidad=r.getCantidad();
			for(Sector s:sectores){
				if(cantidad<=0)
					break;
				List<Mesa>mesasSector=s.getMesas();//obtengo las mesas del sector
				cantidad=r.getCantidad();
				aux=new ArrayList<Mesa>();
				for(Mesa m:mesasSector){ //recorro mesas del sector
					
					if(!mesas.contains(m) && m.getEstado().equals("disponible")){
						
						cantidad=cantidad-m.getCapacidad();
						aux.add(m);
						if(cantidad<=0){
							for(Mesa me:aux)//paso las mesas
								mesas.add(me);
							aux=new ArrayList<Mesa>();//inicializo
							
							break;
						}
					}else{
						aux=new ArrayList<Mesa>();
					}
				}
			}
		}
		
				
		return mesas;
	}
	
	private List<Mesa> getMesas(List<Mesa> mesas, int cantComenzales, SalonDTO salon) {
		List<Sector>sectores=HibernateSectorDAO.getInstancia().getSectores(salon.getId());
		List<Mesa>aux=new ArrayList<Mesa>();
		
		int cantidad=cantComenzales;
		for(Sector s:sectores){
			if(cantidad<=0)
				return aux;
			List<Mesa>mesasSector=s.getMesas();//obtengo las mesas del sector
			cantidad=cantComenzales;
			aux=new ArrayList<Mesa>();
			for(Mesa m:mesasSector){
				
				if(!mesas.contains(m)&& m.getEstado().equals("disponible")){
					
					cantidad=cantidad-m.getCapacidad();
					aux.add(m);
					if(cantidad<=0){
						return aux;
					}
				}else{
					aux=new ArrayList<Mesa>();
				}
			}
		}
		if(cantidad>0){
			aux=new ArrayList<Mesa>();
		}
		return aux;
		
		
	}
	
	
	public Mesa getMesa(int nroMesa){
		MesaBean m=HibernateMesaDAO.getInstancia().getMesa(nroMesa);
		Mesa mesa=this.fromBeanTOModel(m);
		return mesa;
	}
	
}